二叉搜索树
定义:二叉搜索树为具有以下性质的二叉树:对于每个节点 v
- v 的值 > v的左子树的每个节点的值
- v 的值 < v的右子树的每个节点的值
- 没有重复的节点

性质
基于二叉搜索树的上述性质,相比于其他数据结构的优势在于:
- 查找、插入、删除的时间复杂度较低,为O(log n),最坏为O( n )(数列有序,树退化为线性表)。
- 很容易获取最大值(树的最右结点)、最小值(树的最左节点)、某元素的前驱(左子树的最右)、某元素的后继(右子树的最左)
- 每次插入新的节点都是二叉树线上新的叶子节点,在进行插入操作时,不必移动其他节点,只需改动某节点指针,由空变为非空即可。
- 对二叉搜索树进行中序遍历可得到有序数列。
基本操作
查找算法
- 给定值等于根,返回根。
- 给定值小于根,在根的左子树查找。
- 给定值大于根,在根的右子树查找。
插入算法
从根开始搜索,直到找到一个叶子节点,新的节点作为该叶子的子节点插入。
1 | 100 100 |
删除算法
删除的节点为叶子节点,直接删除即可。
1 | 50 50 |
删除的节点有一个子节点,删除该子节点,并用其唯一子节点代替其位置。
1 | 50 50 |
删除的节点有两个子节点,找到该节点的右子树的最小节点k,以k替换掉待删除节点。
1 | 50 60 |
代码实现
.h文件
1 | typedef struct tree_Node{ |
.c文件
1 | p_Tree_Node newNode(int member){ |
测试代码
1 | void testBinarySearchTree(){ |
进阶
二叉搜索树,在插入数列有序时会退化为链表,插入、删除、查找时间复杂度退化为O( n ),为降低二叉搜索树的高度可以通过构建平衡二叉树,它要求左右两个子树的高度差的绝对值不超过1,这样就可以将搜索树的高度尽可能减小。常用的算法有红黑树、AVL Tree、SBT等。
如果对你有帮助的话,Star✨下一吧!